/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.thinkgem.jeesite.modules.cms.web;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.thinkgem.jeesite.common.service.ServiceException;
import com.thinkgem.jeesite.common.web.BaseController;

/**
 * 文章Controller
 * @author ThinkGem
 * @version 2013-3-23
 */
@Controller
@RequestMapping(value = "${adminPath}/cms/upload")
public class UploadController extends BaseController {
	
    private PrintWriter writer = null;

    private static final ObjectMapper objectMapper = new ObjectMapper();
    
	//富文本编辑器上传文件调用
	@RequestMapping(value = "upload", method = RequestMethod.POST)  
	public void upload(HttpServletRequest request, HttpServletResponse response) throws Exception { 
		try {
			//文件保存目录路径
			String savePath = request.getSession().getServletContext().getRealPath("/") + "attached/";
	
			//文件保存目录URL
			String saveUrl  = request.getContextPath() + "/attached/";
	
			//定义允许上传的文件扩展名
			HashMap<String, String> extMap = new HashMap<String, String>();
			extMap.put("image", "gif,jpg,jpeg,png,bmp");
			extMap.put("flash", "swf,flv");
			extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb,mp4");
			extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
	
			//最大文件大小
			long maxSize = 1024*1024*20;
			
	        response.reset();
	        response.setCharacterEncoding("UTF-8");
	        response.setContentType("text/html");
			writer = response.getWriter();
			
			if(!ServletFileUpload.isMultipartContent(request)){
				writer.println(objectMapper.writeValueAsString(getError("请选择文件。")));
				return;
			}
	
			//检查目录
			File uploadDir = new File(savePath);
			if(!uploadDir.isDirectory()){
				uploadDir.mkdirs();
			}
			//检查目录写权限
			if(!uploadDir.canWrite()){
				writer.println(objectMapper.writeValueAsString(getError("上传目录没有写权限。")));
				return ;
			}
			
			String dirName = request.getParameter("dir");
			if (dirName == null) {
				dirName = "image";
			}
			if(!extMap.containsKey(dirName)){
				writer.println(objectMapper.writeValueAsString(getError("目录名不正确。")));
				return ;
			}
			//创建文件夹
			savePath += dirName + "/";
			saveUrl += dirName + "/";
			File saveDirFile = new File(savePath);
			if (!saveDirFile.exists()) {
				saveDirFile.mkdirs();
			}
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
			String ymd = sdf.format(new Date());
			savePath += ymd + "/";
			saveUrl += ymd + "/";
			File dirFile = new File(savePath);
			if (!dirFile.exists()) {
				dirFile.mkdirs();
			}

			MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
			Map<String, MultipartFile> fileMap = mRequest.getFileMap();
			String fileName = null;
			for (Iterator<Map.Entry<String, MultipartFile>> it = fileMap.entrySet().iterator(); it.hasNext();) {
				Map.Entry<String, MultipartFile> entry = it.next();
				MultipartFile mFile = entry.getValue();
				fileName = mFile.getOriginalFilename();
				long fileSize = mFile.getSize();
				
				//检查文件大小
				if(fileSize > maxSize){
					writer.println(objectMapper.writeValueAsString(getError("上传文件大小超过限制。")));
					return ;
				}
				//检查扩展名
				String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
				if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
					writer.println(objectMapper.writeValueAsString(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。")));
					return ;
				}
		
				SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
				String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
				BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(savePath + newFileName));
				FileCopyUtils.copy(mFile.getInputStream(), outputStream);
				
		
				Map<String,Object> obj = new HashMap<String,Object>();  
				obj.put("error", 0);  
				obj.put("url", saveUrl + newFileName);  
				int index1=fileName.lastIndexOf("\\");  
				if(index1!=-1){  
				    fileName=fileName.substring(index1+1);  
				}  
				int index2=fileName.lastIndexOf("/");  
				if(index2!=-1){  
				    fileName=fileName.substring(index2+1);  
				}  
				  
				obj.put("fileName", fileName);  
				writer.println(objectMapper.writeValueAsString(obj)); 
			}
		} catch (ServiceException e1) {
			writer.println(objectMapper.writeValueAsString(getError(e1.getMessage())));
			return ;
		}
		return ;
	}
	private Map<String,Object> getError(String message) {
		Map<String,Object> obj = new HashMap<String,Object>();  
		obj.put("error", 1);
		obj.put("message", message);
		return obj;
	}



}
